#include "login_register.h"
#include "token.h"
// 生成随机盐值
void generate_salt(char *salt, size_t length)
{
    const char charset[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    for (size_t i = 0; i < length; i++)
    {
        salt[i] = charset[rand() % (sizeof(charset) - 1)];
    }
    salt[length] = '\0';
}

// // 检查用户名是否已存在
// int is_user_exists(MYSQL *conn, const char *username, int *is_exist)
// {
//     char query[256];
//     snprintf(query, sizeof(query), "SELECT user_id FROM User WHERE user_name = '%s' AND is_deleted = 0", username);

//     if (mysql_query(conn, query))
//     {
//         fprintf(stderr, "查询失败: %s\n", mysql_error(conn));
//         return -1;
//     }

//     MYSQL_RES *result = mysql_store_result(conn);
//     *is_exist = (mysql_num_rows(result) > 0);
//     mysql_free_result(result);
//     return 0;
// }

// int handle_register_request_command(int sockfd, MYSQL *conn, const char *username)
// {
//     printf("处理注册请求\n");
//     printf("before\n");
//     // 准备SQL查询语句
//     char query[256];
    
//     snprintf(query, sizeof(query), "SELECT user_id,user_salt FROM User WHERE user_name = '%s';", username);
//     printf("after\n");
//     // 执行查询
//     if (mysql_query(conn, query))
//     {
//         printf("查询失败: %s\n", mysql_error(conn));
//         return -1;
//     }

//     // 获取查询结果
//     MYSQL_RES *result = mysql_store_result(conn);
//     if (!result)
//     {
//         printf("获取结果集失败: %s\n", mysql_error(conn));
//         return -1;
//     }
//     printf("after\n");
//     // 检查是否有匹配的用户
//     if (mysql_num_rows(result) != 0)
//     {
//         printf("用户名已存在: %s\n", username);
//         mysql_free_result(result);
//         int ret = sendCommand(sockfd, ERR_USER_EXISTS, FAIL, NULL, 0);
//         if (ret != 0)
//         {
//             printf("用户名已存在信息发送失败了\n");
//         }
//         printf("已发送用户名已存在信息\n");
//         return -1;
//     }

//     char salt[45] = {0};
//     // 生成随机盐值

//     generate_salt(salt, 40);

//     // 发送盐值
//     int ret = sendCommand(sockfd, CMD_REGISTER_APPLY, SUCESS, salt, strlen(salt));
//     if (ret != 0)
//     {
//         printf("发送盐值其实失败了\n");
//     }
//     printf("已发送盐值: %s\n", salt);

//     return 0;
// }

// int handle_register_command(int sockfd, MYSQL *conn, const char *combined_data)
// {
//     printf("处理注册命令\n");
//     printf("before\n");
//     char username[256] = {0};
//     char encrypted_pass[256] = {0};
//     char salt[256] = {0};
    
//     // 跳过前导空格（如果有）
//     while (*combined_data == ' ')
//         combined_data++;
    
//     // 解析 username（直到遇到第一个空格序列）
//     const char *p = combined_data;
//     while (*p && *p != ' ')
//     {
//         p++;
//     }
//     size_t username_len = p - combined_data;
//     strncpy(username, combined_data, username_len);
//     username[username_len] = '\0';
    
//     // 跳过中间的空格（可能有多个）
//     while (*p == ' ')
//         p++;

//     // 解析 encrypted_pass（直到遇到第二个空格序列）
//     const char *pass_start = p;
//     while (*p && *p != ' ')
//     {
//         p++;
//     }
//     size_t pass_len = p - pass_start;
//     strncpy(encrypted_pass, pass_start, pass_len);
//     encrypted_pass[pass_len] = '\0';

//     // 跳过剩余的空格（可能有多个）
//     while (*p == ' ')
//         p++;
    
//     printf("after\n");
//     // 剩余部分就是 salt
//     strncpy(salt, p, sizeof(salt) - 1);
//     salt[sizeof(salt) - 1] = '\0'; // 确保字符串终止

//     printf("username: %s\n", username);
//     printf("encrypted_pass: %s\n", encrypted_pass);
//     printf("salt: %s\n", salt);

//     // 准备SQL语句（建议改用参数化查询防止SQL注入）
//     // char query[512];
//     // snprintf(query, sizeof(query),
//     //          "INSERT INTO users (user_name, user_pwd, user_salt) "
//     //          "VALUES ('%s', '%s', '%s')",
//     //          username, encrypted_pass, salt);

//     printf("我要执行sql了\n");
//     char data_elem[1024] = {0};
//     sprintf(data_elem, "(default,'%s','%s','%s',default)", username, encrypted_pass, salt);

//     // 执行SQL
//     if (insertDataElem(conn, "User", data_elem) == -1)
//     {
//         fprintf(stderr, "注册失败: %s\n", mysql_error(conn));
//         sendCommand(sockfd, CMD_REGISTER, FAIL, "Database error", strlen("Database error"));
//         return -1;
//     }
//     createUserDir(conn, username);
//     printf("sql语句执行完了\n");
//     printf("用户 %s 注册成功\n", username);
//     sendCommand(sockfd, CMD_REGISTER, SUCESS, NULL, 0);
//     return 0;
// }

// 检查用户名是否已存在
// 返回: 1=存在, 0=不存在, -1=错误
// 检查用户名是否已存在
// 返回: 1=存在, 0=不存在, -1=错误
// 检查用户名是否已存在
// 返回: 1=存在, 0=不存在, -1=错误
int is_user_exists(MYSQL *conn, const char *username)
{
    if (!username || strlen(username) > 50)
    { // 假设用户名最长50字符
        return -1;
    }

    char query[256];
    snprintf(query, sizeof(query),
             "SELECT 1 FROM User WHERE user_name=? LIMIT 1");

    MYSQL_STMT *stmt = mysql_stmt_init(conn);
    if (!stmt)
        return -1;

    if (mysql_stmt_prepare(stmt, query, strlen(query)) ||
        mysql_stmt_param_count(stmt) != 1)
    {
        mysql_stmt_close(stmt);
        return -1;
    }

    MYSQL_BIND bind = {0};
    bind.buffer_type = MYSQL_TYPE_STRING;
    bind.buffer = (char *)username;
    bind.buffer_length = strlen(username);

    if (mysql_stmt_bind_param(stmt, &bind) ||
        mysql_stmt_execute(stmt))
    {
        mysql_stmt_close(stmt);
        return -1;
    }

    mysql_stmt_store_result(stmt);
    int exists = (mysql_stmt_num_rows(stmt) > 0);
    mysql_stmt_close(stmt);

    return exists;
}

int handle_register_request_command(int sockfd)
{
    char salt[45] = {0};
    // 生成随机盐值
    generate_salt(salt, 40);

    // 发送盐值
    int ret = sendCommand(sockfd, CMD_REGISTER_APPLY, SUCESS, salt, strlen(salt));
    if (ret != 0)
    {
        printf("发送盐值其实失败了\n");
    }
    printf("已发送盐值: %s\n", salt);

    return 0;
}

int handle_register_command(int sockfd, MYSQL *conn, const char *combined_data)
{
    printf("处理注册命令\n");

    char username[256] = {0};
    char encrypted_pass[256] = {0};
    char salt[256] = {0};

    // 跳过前导空格（如果有）
    while (*combined_data == ' ')
        combined_data++;

    // 解析 username（直到遇到第一个空格序列）
    const char *p = combined_data;
    while (*p && *p != ' ')
    {
        p++;
    }
    size_t username_len = p - combined_data;
    strncpy(username, combined_data, username_len);
    username[username_len] = '\0';

    // 跳过中间的空格（可能有多个）
    while (*p == ' ')
        p++;

    // 解析 encrypted_pass（直到遇到第二个空格序列）
    const char *pass_start = p;
    while (*p && *p != ' ')
    {
        p++;
    }
    size_t pass_len = p - pass_start;
    strncpy(encrypted_pass, pass_start, pass_len);
    encrypted_pass[pass_len] = '\0';

    // 跳过剩余的空格（可能有多个）
    while (*p == ' ')
        p++;

    // 剩余部分就是 salt
    strncpy(salt, p, sizeof(salt) - 1);
    salt[sizeof(salt) - 1] = '\0'; // 确保字符串终止

    printf("username: %s\n", username);
    printf("encrypted_pass: %s\n", encrypted_pass);
    printf("salt: %s\n", salt);


    // 返回: 1=存在, 0=不存在, -1=错误
    if(is_user_exists(conn, username) == 1){
        printf("用户名已存在\n");
        sendCommand(sockfd, ERR_USER_EXISTS, FAIL, NULL, 0);
        return -1;
    }

    // 准备SQL语句（建议改用参数化查询防止SQL注入）
    char query[4096] = {0};
    snprintf(query, sizeof(query),
             "INSERT INTO User (user_name, user_pwd, user_salt) "
             "VALUES ('%s', '%s', '%s')",
             username, encrypted_pass, salt);

    printf("我要执行sql了\n");

    // 执行SQL
    if (mysql_query(conn, query))
    {
        fprintf(stderr, "注册失败: %s\n", mysql_error(conn));
        sendCommand(sockfd, CMD_REGISTER, FAIL, "Database error", strlen("Database error"));
        return -1;
    }
    int create_ret = createUserDir(conn,username);
    if(create_ret != 0) {
        printf("创建用户根目录失败.\n");
        return -1;
    }
    printf("sql语句执行完了\n");
    printf("用户 %s 注册成功\n", username);
    sendCommand(sockfd, CMD_REGISTER, SUCESS, NULL, 0);
    return 0;
}

int handle_login_request_command(int sockfd, MYSQL *conn, const char *username)
{
    printf("处理登录请求\n");
    printf("username = %s\n", username);
    // 准备SQL查询语句
    char query[256];
    snprintf(query, sizeof(query), "SELECT user_id,user_salt FROM User WHERE user_name = '%s'", username);

    // 执行查询
    if (mysql_query(conn, query))
    {
        printf("查询失败: %s\n", mysql_error(conn));
        int ret = sendCommand(sockfd, CMD_LOGIN_APPLY , FAIL, NULL, 0);
        if (ret != 0)
        {
            printf("用户名或密码错误信息发送失败了\n");
        }
        printf("已发送用户名或密码错误信息\n");
        return -1;
    }

    // 获取查询结果
    MYSQL_RES *result = mysql_store_result(conn);

    // // 检查是否有匹配的用户
    if (mysql_num_rows(result) == 0)
    {
        printf("用户不存在: %s\n", username);
        mysql_free_result(result);
        int ret = sendCommand(sockfd, CMD_LOGIN_APPLY , FAIL, NULL, 0);
        if (ret != 0)
        {
            printf("用户名或密码错误信息发送失败了\n");
        }
        printf("已发送用户名或密码错误信息\n");
        return -1;
    }

    // 获取盐值
    MYSQL_ROW row = mysql_fetch_row(result);
    const char *salt = row[1];

    printf("查询到盐值: %s\n", salt);

    // 发送盐值
    int ret = sendCommand(sockfd, CMD_LOGIN_APPLY, SUCESS, salt, strlen(salt));
    if (ret != 0)
    {
        printf("发送盐值失败\n");
        mysql_free_result(result);
        return -1;
    }

    printf("已发送盐值: %s\n", salt);
    mysql_free_result(result);

    return 0;
}

int handle_login_command(int sockfd, MYSQL *conn, const char *combined_data, int *user_id)
{
    printf("处理登录命令\n");
    char username[256] = {0};
    char encrypted_pass[256] = {0};
    char salt[256] = {0};

    // 跳过前导空格（如果有）
    while (*combined_data == ' ')
        combined_data++;

    // 解析 username（直到遇到第一个空格序列）
    const char *p = combined_data;
    while (*p && *p != ' ')
    {
        p++;
    }
    size_t username_len = p - combined_data;
    strncpy(username, combined_data, username_len);
    username[username_len] = '\0';

    // 跳过中间的空格（可能有多个）
    while (*p == ' ')
        p++;

    // 解析 encrypted_pass（直到遇到第二个空格序列）
    const char *pass_start = p;
    while (*p && *p != ' ')
    {
        p++;
    }
    size_t pass_len = p - pass_start;
    strncpy(encrypted_pass, pass_start, pass_len);
    encrypted_pass[pass_len] = '\0';

    // 跳过剩余的空格（可能有多个）
    while (*p == ' ')
        p++;

    // 剩余部分就是 salt
    strncpy(salt, p, sizeof(salt) - 1);
    salt[sizeof(salt) - 1] = '\0'; // 确保字符串终止

    printf("username: %s\n", username);
    printf("encrypted_pass: %s\n", encrypted_pass);
    printf("salt: %s\n", salt);

    // 准备SQL语句 - 查询用户名和密码是否匹配
    char query[4096]= {0}; 
    snprintf(query, sizeof(query),
             "SELECT user_id FROM User WHERE user_name = '%s' AND user_pwd = '%s' AND is_deleted = 1;",
             username, encrypted_pass);

    // 执行SQL查询
    if (mysql_query(conn, query))
    {
        printf("查询失败: %s\n", mysql_error(conn));
        sendCommand(sockfd, CMD_LOGIN, FAIL, "数据库查询失败", strlen("数据库查询失败"));
        return -1;
    }

    // 获取查询结果
    MYSQL_RES *result = mysql_store_result(conn);
    if (!result)
    {
        printf("获取结果集失败: %s\n", mysql_error(conn));
        sendCommand(sockfd, CMD_LOGIN, FAIL, "获取查询结果失败", strlen("获取查询结果失败"));
        return -1;
    }

    // 检查是否有匹配的用户
    // if (mysql_num_rows(result) == 0)
    // {
    //     printf("用户名或密码错误\n");
    //     mysql_free_result(result);
    //     sendCommand(sockfd, ERR_NAME_PASSWORD, FAIL, NULL, 0);
    //     return -1;
    // }

    // 登录成功
    MYSQL_ROW row = mysql_fetch_row(result);
    printf("用户 %s (ID: %s) 登录验证成功\n", username, row[0]);
    *user_id = atoi(row[0]);
    mysql_free_result(result);

    // 登录成功
    // row = mysql_fetch_row(result);
    // printf("用户 %s (ID: %s) 登录验证成功\n", username, row[0]);

    // mysql_free_result(result);

    // 生成JWT Token
    char *jwt_token = generate_jwt(username);
    printf("生成的Token: %s\n", jwt_token);

    sendCommand(sockfd, CMD_LOGIN, SUCESS, jwt_token, strlen(jwt_token));

    // 发送成功响应
    // char success_msg[128];
    // snprintf(success_msg, sizeof(success_msg), "欢迎 %s", username);
    // sendCommand(sockfd, CMD_LOGIN, SUCESS, jwt_token, strlen(jwt_token));

    return 0;
}
